
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>helm 简介与入门</title>
            </head>
            <body>
            <a href="https://andyoung.blog.csdn.net">原作者博客</a>
            <div id="content_views" class="markdown_views prism-atom-one-light">
                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                    </svg>
                    <p><a href="https://helm.sh/" rel="nofollow">Helm</a> 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样，能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。</p> 
<p><strong>解决问题</strong>：</p> 
<p>能对多个模板文件（yaml文件）进行统一管理，设想一下，如果没有helm，如何执行多个模板文件呢？那就得一个个的执行kubectl apply -f xxx.yaml。而如今有了helm，只需要将文件放入chart包中，然后一句helm install xxx path便可以执行所有的模板文件。当然helm的好处不仅于此，还有其他便利之处，有待大家挖掘。</p> 
<h2><a id="_7"></a>用途</h2> 
<p>做为 Kubernetes 的一个包管理工具，<code>Helm</code>具有如下功能：</p> 
<ul><li>创建新的 chart</li><li>chart 打包成 tgz 格式</li><li>上传 chart 到 chart 仓库或从仓库中下载 chart</li><li>在<code>Kubernetes</code>集群中安装或卸载 chart</li><li>管理用<code>Helm</code>安装的 chart 的发布周期</li></ul> 
<h2><a id="_17"></a>安装</h2> 
<h4><a id="_19"></a>用二进制版本安装</h4> 
<p>每个Helm 版本]都提供了各种操作系统的二进制版本，这些版本可以手动下载和安装。</p> 
<ol><li>选择Helm版本查看Helm和对应支持的Kubernetes版本，可以参考 <a href="https://helm.sh/zh/docs/topics/version_skew/" rel="nofollow">Helm 版本支持策略</a>。</li><li>下载安装包 <a href="https://github.com/helm/helm/releases">https://github.com/helm/helm/releases</a></li><li>解压(<code>tar -zxvf helm-v3.0.0-linux-amd64.tar.gz</code>)</li><li>在解压目中找到<code>helm</code>程序，移动到需要的目录中(<code>mv linux-amd64/helm /usr/local/bin/helm</code>)</li></ol> 
<p>然后就可以执行客户端程序并 <a href="https://helm.sh/zh/docs/intro/quickstart/#%E5%88%9D%E5%A7%8B%E5%8C%96" rel="nofollow">添加稳定仓库</a>: <code>helm help</code>.</p> 
<h4><a id="_30"></a>使用脚本安装</h4> 
<p>Helm现在有个安装脚本可以自动拉取最新的Helm版本并在 <a href="https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3" rel="nofollow">本地安装</a>。</p> 
<p>您可以获取这个脚本并在本地执行。它良好的文档会让您在执行之前知道脚本都做了什么。</p> 
<pre><code class="prism language-console">$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
</code></pre> 
<p>如果想直接执行安装，运行<code>curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash</code>。</p> 
<h4><a id="Apt_DebianUbuntu_44"></a>使用Apt (Debian/Ubuntu)</h4> 
<p>Helm社区成员贡献了针对Apt的一个 <a href="https://helm.baltorepo.com/stable/debian/" rel="nofollow">Helm包</a>，包通常是最新的。</p> 
<pre><code class="prism language-console">curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg &gt; /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
</code></pre> 
<h2><a id="Helm_56"></a>使用Helm</h2> 
<h3><a id="_58"></a>三大概念</h3> 
<ul><li> <p><em>Chart</em> : 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序，工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula，Apt dpkg，或 Yum RPM 在Kubernetes 中的等价物。</p> </li><li> <p><em>Repository（仓库）</em> : 是用来存放和共享 charts 的地方。它就像 Perl 的 <a href="https://www.cpan.org/" rel="nofollow">CPAN 档案库网络</a> 或是 Fedora 的 <a href="https://src.fedoraproject.org/" rel="nofollow">软件包仓库</a>，只不过它是供 Kubernetes 包所使用的。</p> </li><li> <p><em>Release</em> : 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 <em>release</em>。以 MySQL chart为例，如果你想在你的集群中运行两个数据库，你可以安装该chart两次。每一个数据库都会拥有它自己的 <em>release</em> 和 <em>release name</em>。</p> </li></ul> 
<p>在了解了上述这些概念以后，我们就可以这样来解释 Helm：</p> 
<p>Helm 安装 <em>charts</em> 到 Kubernetes 集群中，每次安装都会创建一个新的 <em>release</em>。你可以在 Helm 的 chart <em>repositories</em> 中寻找新的 chart。</p> 
<h3><a id="helm_search_Charts_70"></a>helm search：查找 Charts</h3> 
<p>Helm 自带一个强大的搜索命令，可以用来从两种来源中进行搜索：</p> 
<ul><li><code>helm search hub</code> 从 <a href="https://artifacthub.io/" rel="nofollow">Artifact Hub</a> 中查找并列出 helm charts。 Artifact Hub中存放了大量不同的仓库。</li><li><code>helm search repo</code> 从你添加（使用 <code>helm repo add</code>）到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索，无需连接互联网。</li></ul> 
<p>你可以通过运行 <code>helm search hub</code> 命令找到公开可用的charts：</p> 
<pre><code>$ helm search hub wordpress
URL                                                 CHART VERSION APP VERSION DESCRIPTION
https://hub.helm.sh/charts/bitnami/wordpress        7.6.7         5.2.4       Web publishing platform for building blogs and ...
https://hub.helm.sh/charts/presslabs/wordpress-...  v0.6.3        v0.6.3      Presslabs WordPress Operator Helm Chart
https://hub.helm.sh/charts/presslabs/wordpress-...  v0.7.1        v0.7.1      A Helm chart for deploying a WordPress site on ...
</code></pre> 
<p>上述命令从 Artifact Hub 中搜索所有的 <code>wordpress</code> charts。</p> 
<p>如果不进行过滤，<code>helm search hub</code> 命令会展示所有可用的 charts。</p> 
<p>使用 <code>helm search repo</code> 命令，你可以从你所添加的仓库中查找chart的名字。</p> 
<pre><code class="prism language-console">$ helm repo add brigade https://brigadecore.github.io/charts
"brigade" has been added to your repositories
$ helm search repo brigade
NAME                          CHART VERSION APP VERSION DESCRIPTION
brigade/brigade               1.3.2         v1.2.1      Brigade provides event-driven scripting of Kube...
brigade/brigade-github-app    0.4.1         v0.2.1      The Brigade GitHub App, an advanced gateway for...
brigade/brigade-github-oauth  0.2.0         v0.20.0     The legacy OAuth GitHub Gateway for Brigade
brigade/brigade-k8s-gateway   0.1.0                     A Helm chart for Kubernetes
brigade/brigade-project       1.0.0         v1.0.0      Create a Brigade project
brigade/kashti                0.4.0         v0.4.0      A Helm chart for Kubernetes
</code></pre> 
<p>Helm 搜索使用模糊字符串匹配算法，所以你可以只输入名字的一部分：</p> 
<pre><code class="prism language-console">$ helm search repo kash
NAME            CHART VERSION APP VERSION DESCRIPTION
brigade/kashti  0.4.0         v0.4.0      A Helm chart for Kubernetes
</code></pre> 
<p>搜索是用来发现可用包的一个好办法。一旦你找到你想安装的 helm 包，你便可以通过使用 <code>helm install</code> 命令来安装它。</p> 
<h3><a id="helm_install_helm__116"></a>helm install：安装一个 helm 包</h3> 
<p>使用 <code>helm install</code> 命令来安装一个新的 helm 包。最简单的使用方法只需要传入两个参数：你命名的release名字和你想安装的chart的名称。</p> 
<pre><code>$ helm install happy-panda bitnami/wordpress
NAME: happy-panda
LAST DEPLOYED: Tue Jan 26 10:27:17 2021
NAMESPACE: default
...
</code></pre> 
<p>现在<code>wordpress</code> chart 已经安装。注意安装chart时创建了一个新的 <em>release</em> 对象。上述发布被命名为 <code>happy-panda</code>。 （如果想让Helm生成一个名称，删除发布名称并使用<code>--generate-name</code>。）</p> 
<p>在安装过程中，<code>helm</code> 客户端会打印一些有用的信息，其中包括：哪些资源已经被创建，release当前的状态，以及你是否还需要执行额外的配置步骤。</p> 
<p>Helm按照以下顺序安装资源：</p> 
<ul><li>Namespace</li><li>NetworkPolicy</li><li>ResourceQuota</li><li>LimitRange</li><li>PodSecurityPolicy</li><li>PodDisruptionBudget</li><li>ServiceAccount</li><li>Secret</li><li>SecretList</li><li>ConfigMap</li><li>StorageClass</li><li>PersistentVolume</li><li>PersistentVolumeClaim</li><li>CustomResourceDefinition</li><li>ClusterRole</li><li>ClusterRoleList</li><li>ClusterRoleBinding</li><li>ClusterRoleBindingList</li><li>Role</li><li>RoleList</li><li>RoleBinding</li><li>RoleBindingList</li><li>Service</li><li>DaemonSet</li><li>Pod</li><li>ReplicationController</li><li>ReplicaSet</li><li>Deployment</li><li>HorizontalPodAutoscaler</li><li>StatefulSet</li><li>Job</li><li>CronJob</li><li>Ingress</li><li>APIService</li></ul> 
<p>Helm 客户端不会等到所有资源都运行才退出。许多 charts 需要大小超过 600M 的 Docker 镜像，可能需要很长时间才能安装到集群中。</p> 
<p>你可以使用 <code>helm status</code> 来追踪 release 的状态，或是重新读取配置信息：</p> 
<pre><code>$ helm status happy-panda
NAME: happy-panda
LAST DEPLOYED: Tue Jan 26 10:27:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
** Please be patient while the chart is being deployed **

Your WordPress site can be accessed through the following DNS name from within your cluster:

    happy-panda-wordpress.default.svc.cluster.local (port 80)

To access your WordPress site from outside the cluster follow the steps below:

1. Get the WordPress URL by running these commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w happy-panda-wordpress'

   export SERVICE_IP=$(kubectl get svc --namespace default happy-panda-wordpress --template "{<!-- -->{ range (index .status.loadBalancer.ingress 0) }}{<!-- -->{.}}{<!-- -->{ end }}")
   echo "WordPress URL: http://$SERVICE_IP/"
   echo "WordPress Admin URL: http://$SERVICE_IP/admin"

2. Open a browser and access WordPress using the obtained URL.

3. Login with the following credentials below to see your blog:

  echo Username: user
  echo Password: $(kubectl get secret --namespace default happy-panda-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)
</code></pre> 
<p>上述信息展示了 release 的当前状态。</p> 
<h4><a id="_208"></a></h4> 
<h3><a id="helm_install__210"></a>helm install 详解</h3> 
<h5><a id="_212"></a>安装方式</h5> 
<p><code>helm install</code> 有六种不同的方式来标识需要安装的chart：</p> 
<ol><li>通过chart引用： helm install mymaria example/mariadb</li><li>通过chart包： helm install mynginx ./nginx-1.2.3.tgz</li><li>通过未打包chart目录的路径： helm install mynginx ./nginx</li><li>通过URL绝对路径： helm install mynginx https://example.com/charts/nginx-1.2.3.tgz</li><li>通过chart引用和仓库url： helm install --repo https://example.com/charts/ mynginx nginx</li><li>通过OCI注册中心： helm install mynginx --version 1.2.3 oci://example.com/charts/nginx</li></ol> 
<h5><a id="chart_223"></a>修改配置，重写要重写chart中的值</h5> 
<p>要重写chart中的值，使用<code>--values</code>参数传递一个文件或者使用’–set’参数在命令行传递配置，强制使用字符串要用<code>--set-string</code>。 当值本身对于命令行太长或者是动态生成的时候，可以使用<code>-set-file</code> 设置独立的值。也可以在命令行使用’–set-json’参数设置json值(scalars/objects/arrays)。</p> 
<blockquote> 
 <p>通过-f参数传递的文件,安装本地已解压的 chart</p> 
</blockquote> 
<pre><code>$ helm install -f myvalues.yaml myredis ./redis
</code></pre> 
<blockquote> 
 <p>–set设置的值</p> 
</blockquote> 
<pre><code> helm install --set name=prod myredis ./redis
</code></pre> 
<blockquote> 
 <p>强制使用字符串</p> 
</blockquote> 
<pre><code>$ helm install --set-string long_int=1234567890 myredis ./redis
</code></pre> 
<blockquote> 
 <p>使用文件</p> 
</blockquote> 
<pre><code>$ helm install --set-file my_script=dothings.sh myredis ./redis
</code></pre> 
<blockquote> 
 <p>使用json</p> 
</blockquote> 
<pre><code>$ helm install --set-json 'master.sidecars=[{"name":"sidecar","image":"myImage","imagePullPolicy":"Always",ports":[{"name":"portname","containerPort":1234
</code></pre> 
<p>你可以多次指定<code>--values</code> / <code>-f</code>参数。最右侧指定的文件优先级最高。比如，如果两个文件myvalues.yaml和override.yaml 都包含名为’Test’的可以，override.yaml中的值优先：</p> 
<pre><code>$ helm install -f myvalues.yaml -f override.yaml  myredis ./redis
</code></pre> 
<p>可以指定<code>--set</code>参数多次，最右边的参数优先级最高，比如，<code>bar</code>和<code>newbar</code>都设置了一个名为<code>foo</code>的可以，'newbar’的值优先：</p> 
<pre><code>$ helm install --set foo=bar --set foo=newbar  myredis ./redis
</code></pre> 
<p>类似地,下面的示例中<code>foo</code>被设置成了<code>["four"]</code>:</p> 
<pre><code>$ helm install --set-json='foo=["one", "two", "three"]' --set-json='foo=["four"]' myredis ./redis
</code></pre> 
<p>下面的示例中，<code>foo</code>被设置成了<code>{"key1":"value1","key2":"bar"}</code>：</p> 
<pre><code>$ helm install --set-json='foo={"key1":"value1","key2":"value2"}' --set-json='foo.key2="bar"' myredis ./redis
</code></pre> 
<h3><a id="helm_upgrade__helm_rollback_release__283"></a>helm upgrade 和 helm rollback：升级 release 和失败时恢复</h3> 
<p>当你想升级到 chart 的新版本，或是修改 release 的配置，你可以使用 <code>helm upgrade</code> 命令。</p> 
<p>一次升级操作会使用已有的 release 并根据你提供的信息对其进行升级。由于 Kubernetes 的 chart 可能会很大而且很复杂，Helm 会尝试执行最小侵入式升级。即它只会更新自上次发布以来发生了更改的内容。</p> 
<pre><code class="prism language-console">$ helm upgrade -f panda.yaml happy-panda bitnami/wordpress
</code></pre> 
<p>在上面的例子中，<code>happy-panda</code> 这个 release 使用相同的 chart 进行升级，但是使用了一个新的 YAML 文件：</p> 
<pre><code class="prism language-yaml"><span class="token key atrule">mariadb.auth.username</span><span class="token punctuation">:</span> user1
</code></pre> 
<p>我们可以使用 <code>helm get values</code> 命令来看看配置值是否真的生效了：</p> 
<pre><code class="prism language-console">$ helm get values happy-panda
mariadb:
  auth:
    username: user1
</code></pre> 
<p><code>helm get</code> 是一个查看集群中 release 的有用工具。正如我们上面所看到的，<code>panda.yaml</code> 中的新值已经被部署到集群中了。</p> 
<p>现在，假如在一次发布过程中，发生了不符合预期的事情，也很容易通过 <code>helm rollback [RELEASE] [REVISION]</code> 命令回滚到之前的发布版本。</p> 
<pre><code class="prism language-console">$ helm rollback happy-panda 1
</code></pre> 
<p>上面这条命令将我们的 <code>happy-panda</code> 回滚到了它最初的版本。release 版本其实是一个增量修订（revision）。 每当发生了一次安装、升级或回滚操作，revision 的值就会加1。第一次 revision 的值永远是1。我们可以使用 <code>helm history [RELEASE]</code> 命令来查看一个特定 release 的修订版本号。</p> 
<h3><a id="_318"></a>安装、升级、回滚时的有用选项</h3> 
<p>你还可以指定一些其他有用的选项来自定义 Helm 在安装、升级、回滚期间的行为。请注意这并不是 cli 参数的完整列表。 要查看所有参数的说明，请执行 <code>helm &lt;command&gt; --help</code> 命令。</p> 
<ul><li><code>--timeout</code>：一个 <a href="https://golang.org/pkg/time/#ParseDuration" rel="nofollow">Go duration</a> 类型的值， 用来表示等待 Kubernetes 命令完成的超时时间，默认值为 <code>5m0s</code>。</li><li><code>--wait</code>：表示必须要等到所有的 Pods 都处于 ready 状态，PVC 都被绑定，Deployments 都至少拥有最小 ready 状态 Pods 个数（<code>Desired</code>减去 <code>maxUnavailable</code>），并且 Services 都具有 IP 地址（如果是<code>LoadBalancer</code>， 则为 Ingress），才会标记该 release 为成功。最长等待时间由 <code>--timeout</code> 值指定。如果达到超时时间，release 将被标记为 <code>FAILED</code>。注意：当 Deployment 的 <code>replicas</code> 被设置为1，但其滚动升级策略中的 <code>maxUnavailable</code> 没有被设置为0时，<code>--wait</code> 将返回就绪，因为已经满足了最小 ready Pod 数。</li><li><code>--no-hooks</code>：不运行当前命令的钩子。</li><li><code>--recreate-pods</code>（仅适用于 <code>upgrade</code> 和 <code>rollback</code>）：这个参数会导致重建所有的 Pod（deployment中的Pod 除外）。（在 Helm 3 中已被废弃）</li></ul> 
<h3><a id="helm_uninstall_release_327"></a>‘helm uninstall’：卸载 release</h3> 
<p>使用 <code>helm uninstall</code> 命令从集群中卸载一个 release：</p> 
<pre><code class="prism language-console">$ helm uninstall happy-panda
</code></pre> 
<p>该命令将从集群中移除指定 release。你可以通过 <code>helm list</code> 命令看到当前部署的所有 release：</p> 
<pre><code class="prism language-console">$ helm list
NAME            VERSION UPDATED                         STATUS          CHART
inky-cat        1       Wed Sep 28 12:59:46 2016        DEPLOYED        alpine-0.1.0
</code></pre> 
<p>从上面的输出中，我们可以看到，<code>happy-panda</code> 这个 release 已经被卸载。</p> 
<p>在上一个 Helm 版本中，当一个 release 被删除，会保留一条删除记录。而在 Helm 3 中，删除也会移除 release 的记录。 如果你想保留删除记录，使用 <code>helm uninstall --keep-history</code>。使用 <code>helm list --uninstalled</code> 只会展示使用了 <code>--keep-history</code> 删除的 release。</p> 
<p><code>helm list --all</code> 会展示 Helm 保留的所有 release 记录，包括失败或删除的条目（指定了 <code>--keep-history</code>）：</p> 
<pre><code class="prism language-console">$  helm list --all
NAME            VERSION UPDATED                         STATUS          CHART
happy-panda     2       Wed Sep 28 12:47:54 2016        UNINSTALLED     wordpress-10.4.5.6.0
inky-cat        1       Wed Sep 28 12:59:46 2016        DEPLOYED        alpine-0.1.0
kindred-angelf  2       Tue Sep 27 16:16:10 2016        UNINSTALLED     alpine-0.1.0
</code></pre> 
<p>注意，因为现在默认会删除 release，所以你不再能够回滚一个已经被卸载的资源了。</p>
                </div>
            </body>
            </html>
            